package ProxyPattern.cglib;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * @author： pang-yun
 * @date： 2021-10-25 16:28
 * 功能目的 ：用于  MethodInterceptor  方法拦截器
 */
@Data
@AllArgsConstructor
public class ProxyFactory implements MethodInterceptor{

    private Object target;

    // 返回 一个代理对象 是 target 对象的代理对象
    public Object getProxyInstance(){
        // 1.创建 一个工具类
        Enhancer enhancer = new Enhancer();
        // 2.设置父类
        enhancer.setSuperclass(target.getClass());
        //3. 设置回调函数
        enhancer.setCallback(this);
        // 4. 创建 子类对象  即代理对象
        return enhancer.create();
    }


    // 重写 intercept 方法， 会调用目标对象的方法
    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("Cglib");
        Object invoke = method.invoke(target, objects);
        return invoke;
    }
}
